--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_rnode_support.py v4.7.2-rc.5 (868d1d64) Text, 10.74 KB
T8b949e# SPDX-License-Identifier: 0BSD
Tff7b72import T7ee787pytest
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backend Tff7b72import Te6edf3rnode_support
Tff7b72def Td2a8fftest_normalize_rnode_tcp_host_backfills_from_portTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
T8b949e"""RNS's Android RNodeInterface reads tcp_host as its own config key.
Configs written with only ``port = tcp://host:port`` (which is all the
desktop RNodeInterface needs) silently try to open the RNode as a serial
device on Android unless tcp_host is also present.
"""
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode TCP]]
type = RNodeInterface
interface_enabled = True
port = tcp://192.0.2.1:4242
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffnormalize_rnode_tcp_host_in_configTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3text Tff7b72= Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fftcp_host = 192.0.2.1:4242Ta5d6ff" Tff7b72in Te6edf3text
Tff7b72def Td2a8fftest_normalize_rnode_tcp_host_leaves_non_tcp_entries_aloneTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode Serial]]
type = RNodeInterface
interface_enabled = True
port = /dev/ttyUSB0
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffnormalize_rnode_tcp_host_in_configTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6fftcp_hostTa5d6ff" Tff7b72not Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_normalize_rnode_tcp_host_is_idempotentTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode TCP]]
type = RNodeInterface
interface_enabled = True
port = tcp://192.0.2.1:4242
tcp_host = 192.0.2.1:4242
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffnormalize_rnode_tcp_host_in_configTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_guard_disables_rnode_when_usbserial4a_missingTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode Serial]]
type = RNodeInterface
interface_enabled = True
port = /dev/ttyUSB0
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = falseTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_guard_disables_rnode_when_jnius_missingTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
T8b949e"""usbserial4a alone is not enough for serial/classic-Bluetooth ports.
RNS's Android RNodeInterface also needs jnius for those transports.
"""
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode Serial]]
type = RNodeInterface
interface_enabled = True
port = /dev/ttyUSB0
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = falseTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_guard_keeps_rnode_when_usbserial4a_and_jnius_availableTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode Serial]]
type = RNodeInterface
interface_enabled = True
port = /dev/ttyUSB0
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = TrueTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_guard_keeps_tcp_rnode_enabled_even_without_usbserial4a_or_jniusTb4b4b4(
Te6edf3tmp_pathTb4b4b4,
Te6edf3monkeypatchTb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e"""RNode over TCP needs no native Android modules and must stay enabled."""
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode TCP]]
type = RNodeInterface
interface_enabled = True
port = tcp://192.0.2.1:4242
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = TrueTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_guard_disables_ble_rnode_when_able_missingTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode BLE]]
type = RNodeInterface
interface_enabled = True
port = ble://aa:bb:cc:dd:ee:ff
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_able_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = falseTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_guard_keeps_ble_rnode_when_able_availableTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode BLE]]
type = RNodeInterface
interface_enabled = True
port = ble://aa:bb:cc:dd:ee:ff
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_able_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = TrueTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_guard_always_disables_rnode_multi_interface_on_androidTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
T8b949e"""RNS has no Android-specific RNodeMultiInterface; it always crashes there."""
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode Multi]]
type = RNodeMultiInterface
interface_enabled = True
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_able_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = falseTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_guard_skips_rnode_multi_interface_off_androidTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[RNode Multi]]
type = RNodeMultiInterface
interface_enabled = True
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_rnode_interfaces_on_androidTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = TrueTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_rnode_serial_supported_on_desktopTb4b4b4(Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffrnode_serial_supportedTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_rnode_serial_supported_on_android_requires_both_modulesTb4b4b4(Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffrnode_serial_supportedTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffrnode_serial_supportedTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72False
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffrnode_serial_supportedTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_rnode_transport_supported_tcp_always_true_on_androidTb4b4b4(Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_able_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3rnode_supportTff7b72.Td2a8ffrnode_transport_supportedTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftcp://example.org:4242Ta5d6ff"Tb4b4b4}Tb4b4b4)
Tff7b72is Tff7b72True
Tb4b4b4)
Tff7b72def Td2a8fftest_rnode_transport_supported_bluetooth_classic_needs_usbserial_and_jniusTb4b4b4(
Te6edf3monkeypatchTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_usbserial4a_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72TrueTb4b4b4)
Te6edf3iface Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffportTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffallow_bluetoothTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fftrueTa5d6ff"Tb4b4b4}
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffrnode_transport_supportedTb4b4b4(Te6edf3ifaceTb4b4b4) Tff7b72is Tff7b72True
Te6edf3monkeypatchTff7b72.Td2a8ffsetattrTb4b4b4(Te6edf3rnode_supportTb4b4b4, Ta5d6ff"Ta5d6ffandroid_jnius_availableTa5d6ff"Tb4b4b4, Tff7b72lambdaTb4b4b4: Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffrnode_transport_supportedTb4b4b4(Te6edf3ifaceTb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_guard_disables_rnode_with_invalid_txpowerTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[t9-srv]]
type = RNodeInterface
interface_enabled = True
port = /dev/ttyUSB0
frequency = 868000000
bandwidth = 125000
txpower = -9
spreadingfactor = 8
codingrate = 5
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3rnode_supportTff7b72.Td2a8ffguard_invalid_rnode_txpower_in_configTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3text Tff7b72= Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = falseTa5d6ff" Tff7b72in Te6edf3textTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_guard_keeps_rnode_with_valid_txpowerTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3config_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffconfigTa5d6ff"
Te6edf3config_pathTff7b72.Td2a8ffwrite_textTb4b4b4(
T8b949e"""[interfaces]
[[Radio]]
type = RNodeInterface
interface_enabled = True
txpower = 7
"""Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3rnode_supportTff7b72.Td2a8ffguard_invalid_rnode_txpower_in_configTb4b4b4(Tffa657strTb4b4b4(Te6edf3config_pathTb4b4b4)Tb4b4b4) Tff7b72is Tff7b72False
Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffinterface_enabled = TrueTa5d6ff" Tff7b72in Te6edf3config_pathTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────